package cn.tedu.core;

import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

/**
 * Author：程Sir
 * Name： SmallServer
 * Content:
 *  负责与指定客户端进行HTTP交互
 *     该线程将来与客户端交互的过程必须遵守HTTP协议要求，采取一问一答的方式进行,固定的解析步骤：
 *     1. 解析请求【问】
 *     2. 处理请求
 *     3. 响应请求【答】
 *
 *
 *
 */
public class RequestHandler implements Runnable {
    // 声明全局变量socket [socket中包含了所有客户端的请求信息]
    private Socket socket;
    public RequestHandler(Socket socket){
        this.socket = socket;
    }
    @Override
    public void run() {
        // 读第一行字符串：请求行
        String line = readLine();
        // 1. 解析请求【问】
        // 对请求行进行拆分，找出请求资源的路径

        String[] data = line.split("\\s");
        // 请求方式
        String method = data[0];
        // 抽象路径
        String url = data[1];
        // 版本信息
        String protocol = data[2];

        System.out.println("拆分之后的结果：");
        System.out.println(method);
        System.out.println(url);
        System.out.println(protocol);
        /*
            读取消息头的信息
            key： value[CRLF]
         */
        // 声明一个存在消息头信息的集合map
        Map<String,String> map = new HashMap<>();
        while (true){
            line = readLine();
            // 因为消息头内容的结束是以单独发生一个连续的字符作为标识的
            if (line.isEmpty()){
                break;
            }
//            System.out.println("读到的消息头是："+line);

            // 按照：冒号进行拆分
            data = line.split(":");
            map.put(data[0],data[1]);
        }

        System.out.println("拆分之后map集合中的数据有：" +map);



    }

    /**
     * 读取一行字符串
     *
     * @return 返回读取到的一行字符串
     */
    private String readLine() {
        try {
            // 获取输入流
            InputStream inputStream = socket.getInputStream();

            // 声明两个标识符
            char pre = ' '; // 已拼接的字符
            char cur = ' '; // 当前读到字符
            // 声明一个空字符串，用来装读到的字符
            StringBuilder builder = new StringBuilder();
            int a ;
            while ((a=inputStream.read())!=-1){
                char b = (char) a; //  将int值转换为char
                // 将读到的字符装入当前字符中，目的是进行判断
                cur = b;
                if ( pre ==13 && cur ==10){ // 字符串末尾的判断
                    break;
                }
                builder.append(cur);
                // 将读到字符拼接完成后，标识为已拼接的zif
                pre = cur;

            }
//            System.out.println("读到的一行内容是："+builder);
            return builder.toString().trim(); // 因为空白符CR（13）已经被拼接进去了，需要去除空白符
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}
